package cn.gcxy.javase.base;

/**
 * 学员类
 * 
 * @author zl
 *
 */
public class Student extends User{
	
	private String name;
	private int age;
	
//开启，查看变量隐藏的问题	
//	private String no;
//	public String getNo() {  //覆盖基类的同签名的方法
//		return no;
//	}

	
	public Student() {
		super();
	}

	public Student(String no, String name) {
		super();
//		this.no = no;  //基类的private成员不能在子类中直接访问
		setNo(no); //可以通过调用基类缺省、protected、pulibc等方法进行操作基类的private数据成员
		this.name = name;
	}

	public Student(String no, String name, int age) {
		super();
		super.setNo(no);
		this.name = name;
		this.age = age;
	}



	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
//		return super.toString();
		StringBuilder sbr=new StringBuilder();
		sbr.append(super.getNo())
			.append(",name=")
			.append(name).append(",age=")
			.append(age);
		return sbr.toString();
	}
	
	/**
	 * 重写equals必须注意： 1 自反性：对于任意的引用值x，x.equals(x)一定为true    2对称性：对于任意的引用值x 和
	 * y，当x.equals(y)返回true，y.equals(x)也一定返回true    3
	 * 传递性：对于任意的引用值x、y和ｚ，如果x.equals
	 * (y)返回true，并且y.equals(z)也返回true，那么x.equals(z)也一定返回 true 4 一致性：对于任意的引用值x 和
	 * y，如果用于equals比较的对象信息没有被修改，多次调用x.equals(y)要么一致地返回true，要么一致地返回false    *   5
	 * 非空性：对于任意的非空引用值x，x.equals(null)一定返回false 请注意：
	 * 重写equals方法后最好重写hashCode方法，否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
	 * 
	 */
	public boolean equals(Object other) {

		if (this == other) // 先检查是否其自反性，后比较other是否为空。这样效率高
			return true;
		if (other == null)
			return false;
		if (!(other instanceof Student))
			return false;

		final Student ouser = (Student) other;

		if (!getNo().equals(ouser.getNo())) {
			return false;
		}
		if (!getName().equals(ouser.getName())) {
			return false;
		}
		return true;
	}

	/**
	 * hashCode主要是用来提高hash系统的查询效率。当hashCode中不进行任何操作时，可以直接让其返回 一常数，或者不进行重写。
	 */
	public int hashCode() {
		int result = getName().hashCode();
		result = 29 * result + getNo().hashCode();  //注意：使用的数据成员要同equals()方法中所使用的数据成员
		return result;
		// return 0;
	}
}
